package com.modelo.dao.comun;

import java.io.Serializable;
import java.util.List;

import com.comun.filtro.FiltroLista;

/**
 * Interfaz con los metodos comunes de los DAOs.
 * 
 * @author David
 * 
 * @param <T>
 */
public interface BaseDAO<T> {

	/**
	 * Borra el objeto que le pasamos por parametro.
	 * 
	 * @param modelObject
	 *            objeto a borrar
	 */
	void delete(T modelObject);

	/**
	 * Busca todos los objetos del tipo que le pasamos por parametro.
	 * 
	 * @param type
	 *            clase tipo en donde iremos a BBDD.
	 * @return devuelve una coleccion de los tipos que hemos pasado por
	 *         parametro.
	 */
	List<T> findAll(Class<T> type);

	/**
	 * Busca el obtejo con la clave que le pasamos por parametro
	 * 
	 * @param type
	 *            tipo de objeto en BBDD.
	 * @param id
	 *            valor de la clave primaria.
	 * @return devuelve el objeto que coincide con el tipo y clave que le
	 *         pasamos por parametro.
	 */
	T findById(Class<T> type, Serializable id);

	/**
	 * Devuelve una lista de tipo T con los ids que le pasamos en listaIds.
	 * 
	 * @param type
	 * @param listaIds
	 * @return List<T>
	 */
	List<T> findByListId(Class<T> type, List<Integer> listaIds);

	/**
	 * Devuelve las listas de obras dadas de altas que corresponde con el filtro
	 * que le pasamos.
	 * 
	 * @param filtro
	 * @return List<T>
	 */
	List<T> getActivos(FiltroLista filtro, FiltroBaseDAO filtroDAO, Class<T> type);

	/**
	 * Obtenemos el numero total de elementos de la busqueda.
	 * 
	 * @return int
	 */
	int getTotal();

	/**
	 * Guarda en base de datos el objeto deseado.
	 * 
	 * @param modelObject
	 *            objeto a guardar.
	 */
	void save(T modelObject);

	/**
	 * Actualiza el objeto que le pasamos.
	 * 
	 * @param modelObject
	 *            objeto a actualizar
	 */
	void update(T modelObject);
}